package br.com.friendzoone.mensagem;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import br.com.friendzoone.modelo.enums.EnumSituacao;
import br.com.friendzoone.modelo.enums.EnumStatusMensagem;
import br.com.friendzoone.modelo.mensagem.Mensagem;
import br.com.friendzoone.modelo.mensagem.MensagemArmazenamento;
import br.com.friendzoone.modelo.pessoa.Pessoa;
import br.com.friendzoone.modelo.relacionamento.RelacionamentoAmigo;
import br.com.friendzoone.pessoa.PessoaSolr;
import br.com.friendzoone.recursos.RecursosFaces;
import br.com.friendzoone.relacionamento.RelacionamentoAmigoSolr;
import br.com.friendzoone.solr.util.ValidacaoException;
import br.com.friendzoone.util.Pages;

@ManagedBean
@SessionScoped
public class MensagemHome extends RecursosFaces implements Pages {

	final MensagemSolr mensagemSolr = new MensagemSolr();
	private Mensagem mensagem = new Mensagem();

	private Pessoa pessoaSelecionada = new Pessoa();

	private List<MensagemArmazenamento> mensagens = new LinkedList<MensagemArmazenamento>();

	public List<MensagemArmazenamento> getMensagens() {
		return  mensagens;
	}

	public void setMensagens(List<MensagemArmazenamento> mensagens) {
		this.mensagens = mensagens;
	}

	public Mensagem getMensagem() {
		return mensagem;
	}

	public void setMensagem(Mensagem mensagem) {
		this.mensagem = mensagem;
	}

	public MensagemSolr getMensagemSolr() {
		return mensagemSolr;
	}

	public void metodo(){
		System.out.println("Chamou o metodo no javascript");
	}
	
	public void verificarMensagensParaEntrega() throws ValidacaoException{
		
		mensagens = new LinkedList<MensagemArmazenamento>();
		
		final Mensagem mensagemParametro = new Mensagem();
		mensagemParametro.setParaPessoa( this.getUsuarioLogado() );
		mensagemParametro.setDePesssoa( this.getPessoaSelecionada() );
		mensagemParametro.setStatusMensagem( EnumStatusMensagem.LEITURA_NAO_CONFIRMADA );
		mensagemParametro.setData(  this.getDateSemMilis( new Date() ));
		
		final MensagemArmazenamentoSolr mensagemArmazenamentoSolr = new MensagemArmazenamentoSolr();
		final List<Mensagem> mensagenRecebidas = mensagemSolr.listar(Mensagem.class, mensagemParametro);
		if( mensagenRecebidas != null ){
			
			for( final Mensagem mensagemFor : mensagenRecebidas ){
				
				final Mensagem mensagemAtual = mensagemSolr.consultarPorId( mensagemFor.getId() , Mensagem.class );
				mensagemAtual.setStatusMensagem( EnumStatusMensagem.LEITURA_CONFIRMADA );
				
				mensagemSolr.alterar( mensagemAtual );
				
				//Salvando o historico
				final MensagemArmazenamento mensagemArmazenamento = new MensagemArmazenamento();
				mensagemArmazenamento.setTextoArmazenametno( mensagemAtual.getMensagem() );
				mensagemArmazenamento.setDePessoaArmazenamento( this.getPessoaSelecionada() );
				mensagemArmazenamento.setParaPessoaArmazenamento( this.getUsuarioLogado() );
				mensagemArmazenamento.setDataArmazenamento( new Date() );
				
				mensagemArmazenamentoSolr.salvar( mensagemArmazenamento );
			}
		}
		final MensagemArmazenamento mensagemArmazenamentoConsulta = new MensagemArmazenamento();
		mensagemArmazenamentoConsulta.setDePessoaArmazenamento( this.getPessoaSelecionada() );
		mensagemArmazenamentoConsulta.setParaPessoaArmazenamento( this.getUsuarioLogado() );
		mensagemArmazenamentoConsulta.setDataArmazenamento( this.getDateSemMilis( new Date() ));
		
		final List<MensagemArmazenamento> mensagensArmazenamento = mensagemArmazenamentoSolr.listar( MensagemArmazenamento.class, mensagemArmazenamentoConsulta );
		
		Collections.sort( mensagensArmazenamento, new Comparator<MensagemArmazenamento>(){

			@Override
			public int compare(MensagemArmazenamento o1, MensagemArmazenamento o2) {
				return o2.getDataArmazenamento().compareTo(o1.getDataArmazenamento());
			}});
		
		mensagens.addAll( mensagensArmazenamento );
		mensagemArmazenamentoSolr.close();
	}
	public String enviar() throws ValidacaoException {

		final MensagemSolr mensagemSolr = new MensagemSolr();
		
		mensagem.setData( new Date() );
		mensagem.setDePesssoa( this.getUsuarioLogado() );
		mensagem.setParaPessoa( this.getPessoaSelecionada() );
		mensagem.setStatusMensagem( EnumStatusMensagem.LEITURA_NAO_CONFIRMADA );
		
		mensagemSolr.salvar( mensagem );
		
		//Verifica se tem alguma mensagem pra mim
		this.verificarMensagensParaEntrega();
		
		mensagemSolr.close();
		mensagem = new Mensagem();
		return VIEW_MENSAGEM;
	}

	public String selecionar(final Pessoa pessoa) {
            
		this.setPessoaSelecionada(pessoa);
		return VIEW_MENSAGEM;
	}

	public Pessoa getPessoaSelecionada() {
		return pessoaSelecionada;
	}

	public void setPessoaSelecionada(Pessoa pessoaSelecionada) {
		this.pessoaSelecionada = pessoaSelecionada;
	}

	public List<Mensagem> atualizarMensagens() {

		return null;
	}

	public List<Pessoa> getPessoasOnline() {

		final RelacionamentoAmigoSolr relacionamentoAmigoSolr = new RelacionamentoAmigoSolr();
		
		final RelacionamentoAmigo relacionamentoAmigo = new RelacionamentoAmigo();
		relacionamentoAmigo.setAmigo( this.getUsuarioLogado() );
		relacionamentoAmigo.setSituacao( EnumSituacao.ATIVO );
		
		
		final List<RelacionamentoAmigo> amigos = relacionamentoAmigoSolr.listar( RelacionamentoAmigo.class,  relacionamentoAmigo );
		if( amigos == null || amigos.isEmpty() ){
			return new ArrayList<Pessoa>();
		}
		
		final List<Pessoa> pessoasOnline = new ArrayList<Pessoa>();
		final PessoaSolr  pessoaSolr = new PessoaSolr();
		for( final RelacionamentoAmigo relacionamentoAmigoFor : amigos ){
			final Pessoa pessoa = pessoaSolr.consultarPorId( relacionamentoAmigoFor.getAmigoRelacionado().getId(), Pessoa.class );
			if( pessoa == null ){
				continue;
			}
			pessoasOnline.add( pessoa );
		}
		relacionamentoAmigoSolr.close();
		return pessoasOnline;
	}
	
	private Date getDateSemMilis(final Date data ){
		SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
		
		Date novaData = null;
		try {
			final String dataTruncada = sd.format(data);
			novaData= sd.parse( dataTruncada );
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return novaData;
	}
}
